home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / lib / mntc6846.zoo / patch / xdiv.s < prev    next >
Encoding:
Text File  |  1994-10-17  |  2.2 KB  |  132 lines

  1. *
  2. *  c68 support routines .Xldiv, .Xlrem, .Xulrem, .Xuldiv, .Xasldiv,
  3. *            .Xaslrem, .Xasulrem, .Xasuldiv
  4. *
  5. *  quotient and remainder of signed and unsigned long quantities
  6. *  (based on a routine used by SozobonX's xdlibs library)
  7. *
  8.     .text
  9.  
  10.     .globl    .Xldiv
  11.     .globl    .Xlrem
  12.     .globl    .Xulrem
  13.     .globl    .Xuldiv
  14.  
  15.     .globl    .Xasldiv
  16.     .globl    .Xaslrem
  17.     .globl    .Xasulrem
  18.     .globl    .Xasuldiv
  19.  
  20.  
  21. .Xasldiv:
  22.     movem.l 4(sp),d0/a1
  23.     exg    d0,a1
  24.     move.l    d0, -(sp)    ; store copy of second operand
  25.     move.l    (a1),-(sp)    ; store value for first operand
  26.     bsr    .Xldiv        ; a1 not destroyed (but stack tidied)
  27.     move.l    d0,(a1)        ; assign result
  28.     bra    fin
  29.  
  30. .Xaslrem:
  31.     movem.l    4(sp),d0/a1
  32.     exg    d0,a1
  33.     move.l    d0, -(sp)    ; store copy of second operand
  34.     move.l    (a1),-(sp)    ; store value for first operand
  35.     bsr    .Xlrem        ; a1 not destroyed (but stack tidied)
  36.     move.l    d0,(a1)        ; assign result
  37.     bra    fin
  38.  
  39. .Xldiv:                ; quotient of signed long quantities
  40.     movem.l    4(sp),d0/d1
  41.     tst.l    d0
  42.     bmi    L1
  43.     tst.l    d1
  44.     bpl    Ruldiv
  45.     neg.l    d1
  46. L0:
  47.     bsr    Rdivu
  48.     neg.l    d0
  49.     bra    fin
  50. L1:    neg.l    d0
  51.     tst.l    d1
  52.     bpl    L0
  53.     neg.l    d1
  54.     bra    Ruldiv
  55.  
  56. .Xlrem:                ; remainder of signed long quantities
  57.     movem.l    4(sp),d0/d1
  58.     tst.l    d1
  59.     bpl    L2
  60.     neg.l    d1
  61. L2:    tst.l    d0
  62.     bpl    Rulrem
  63.     neg.l    d0
  64.     bsr    Rdivu
  65.     exg    d1,d0
  66.     neg.l    d0
  67.     bra    fin
  68.  
  69. .Xulrem:            ; remainder of unsigned long quantities
  70.     movem.l    4(sp),d0/d1
  71. Rulrem:    bsr    Rdivu
  72.     exg    d1,d0
  73.     bra    fin
  74.  
  75. .Xuldiv:            ; quotient of unsigned long quantities
  76.     movem.l    4(sp),d0/d1
  77. Ruldiv:    bsr    Rdivu
  78. fin:    move.l    (sp)+,a0    ; get return address
  79.     addq.l    #8,sp        ; remove two long parameters
  80.     jmp    (a0)        ; return to calling code
  81.  
  82. Rdivu:    cmp.l    d1,d0        ; the real work is done here
  83.     bls    L4
  84.     move.l    d1,d2
  85.     swap    d2
  86.     tst.w    d2
  87.     bne    L6
  88.     move.l    d0,d2
  89.     divu    d1,d2
  90.     bvs    L6
  91.     moveq    #$00,d0
  92.     moveq    #$00,d1
  93.     move.w    d2,d0
  94.     swap    d2
  95.     move.w    d2,d1
  96.     rts
  97. L4:    beq    L5
  98.     move.l    d0,d1
  99.     moveq    #0,d0
  100.     rts
  101. L5:    moveq    #1,d0
  102.     moveq    #0,d1
  103.     rts
  104. L6:    movea.l    d1,a0
  105.     moveq    #31,d2
  106.     moveq    #0,d1
  107. L7:
  108.     add.l    d0,d0
  109.     addx.l    d1,d1
  110.     cmpa.l    d1,a0
  111.     bhi    L8
  112.     sub.l    a0,d1
  113.     addq.l    #1,d0
  114. L8:    dbra    d2,L7
  115.     rts
  116.  
  117. .Xasuldiv:
  118.     movem.l    4(sp),d1/a1
  119.     exg    d1,a1
  120.     move.l    (a1),d0
  121.     bsr    Rdivu
  122.     move.l    d0,(a1)        ; assign result
  123.     bra    fin
  124.  
  125. .Xasulrem:
  126.     movem.l    4(sp),d1/a1
  127.     exg    d1,a1
  128.     move.l    (a1),d0
  129.     bsr    Rdivu
  130.     move.l    d1,(a1)        ; assign result
  131.     bra    fin
  132.